package com.code.day12;

import java.util.Objects;

public class Person {
    private String name;
    private int age;

    public Person() {
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    /**
     * 重写toString方法
     */
/*    public String toString(){
        return name+","+age;
    }*/

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    /**
     * 问题1:为啥obj.name和obj.age报错
     *       obj是Object,接收过来的实参是Person类型,属于多态
     *       而name和age是Person中的成员,属于子类特有内容
     *       多态前提下,不能直接调用子类特有成员,所以报错
     * 解决问题1:
     *       向下转型
     *
     * 问题2:如果调用equals方法,传递的不是Person类型对象,会出现类型转换异常
     * 解决问题2:先判断类型,再强转
     *
     * 问题3: 如果传递null,我们其实不用判断类型,直接返回false
     *       所以我们应该加一个非空判断-&gt; 效率判断
     *
     * 问题4: 如果传递自己,自己和自己equals比较,我们没有必要判断类型
     *        强转,再比较name和age了
     *
     *        所以我们应该直接加个判断,如果地址值一样,证明是同一个对象,直接返回true-&gt; 效率判断
     *
     */
    @Override
    public boolean equals(Object obj) {
        if(this == obj){
            return true;
        }
        if(obj == null || getClass()!= obj.getClass()){
            return false;
        }
        Person person = (Person) obj;
        return person.name.equals(this.name) && person.age == this.age;

    }

}